package com.jaret.demo.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * @author jaret
 * @date 2024/5/13 15:35
 * @description
 */
@Component
public class SlidingWindowRateLimiter {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    private String key;
    private int limit = 100;

    /**
     * 限制每个用户在指定时间内的请求次数
     *
     * @param apiKey 用户标识
     * @param limit  限制次数
     * @param period 时间窗口（单位：秒）
     * @return 是否限流
     */
    public boolean limitRequest(String apiKey, int limit, int period) {
        // 使用 Redis 的 zset 存储用户的请求记录
        String key = "requests:" + apiKey;

        // 获取当前时间戳
        long now = System.currentTimeMillis();

        // 添加请求记录到 zset 中，score 为时间戳
        redisTemplate.opsForZSet().add(key, now, now);

        // 获取在时间窗口内的请求记录数量
        long count = redisTemplate.opsForZSet().count(key, now - period * 1000, now);

        // 判断是否超过限制次数
        return count <= limit;
    }


}
